/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.tigre.consultationsolde.services.impl;

import net.sf.beanlib.provider.replicator.BeanReplicator;

import org.springframework.stereotype.Component;

import fr.generali.accueilclient.tigre.consultationsolde.om.ICritereSelectionSolde;
import fr.generali.accueilclient.tigre.consultationsolde.om.IEnteteConsultationSolde;
import fr.generali.accueilclient.tigre.consultationsolde.om.IQuantity;
import fr.generali.accueilclient.tigre.consultationsolde.om.ISoldeCompteClientChezApporteur;
import fr.generali.accueilclient.tigre.consultationsolde.om.ISoldeCompteClientContrat;
import fr.generali.accueilclient.tigre.consultationsolde.om.ISuiviEtatClient;
import fr.generali.accueilclient.tigre.consultationsolde.om.ITechnique;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOEnteteConsultationSolde;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOQuantity;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOSoldeCompteClientChezApporteur;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOSoldeCompteClientContrat;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOSuiviEtatClient;
import fr.generali.accueilclient.tigre.consultationsolde.om.impl.DTOTechnique;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.datatype.MonetaryQuantity;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.entetes.DtoCritereSelectionSoldeElt;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.entetes.DtoEnteteConsultationSoldeElt;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.fin.compteclient.DtoSoldeCompteClientChezApporteur;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.fin.compteclient.DtoSoldeCompteClientContrat;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.pty.gestionrelationsaffaire.DtoSuiviEtatClient;
import fr.generali.encaisscomptatiersdecaiss.encaissement.tigre.consultationsolde.technique.DtoTechnique;

/**
 * @author Holmes Kelly
 */
@Component("consultationSoldeMapper")
public class ConsultationSoldeMapper {

    /**
     * @param critereSelectionSolde critere selection solde
     * @return DtoCritereSelectionSoldeElt
     */
    public DtoCritereSelectionSoldeElt mapperDtoCritereSelectionSoldeElt(ICritereSelectionSolde critereSelectionSolde) {

        BeanReplicator beanReplicator = new BeanReplicator();

        return beanReplicator.replicateBean(critereSelectionSolde, DtoCritereSelectionSoldeElt.class);

    }

    /**
     * @param dtoEnteteConsultationSoldeElt dto consultation solde
     * @return IEnteteConsultationSolde
     */
    public IEnteteConsultationSolde mapperEnteteConsultationSolde(
                    DtoEnteteConsultationSoldeElt dtoEnteteConsultationSoldeElt) {

        BeanReplicator beanReplicator = new BeanReplicator();

        IEnteteConsultationSolde enteteConsultationSolde =
                        beanReplicator.replicateBean(dtoEnteteConsultationSoldeElt, DTOEnteteConsultationSolde.class);

        enteteConsultationSolde.setInfosTechnique(buildTechnique(dtoEnteteConsultationSoldeElt.getInfosTechnique(),
                        beanReplicator));
        enteteConsultationSolde.setSoldeClientHorsGroupePourIntermediaire(buildCompteClientApporteur(
                        dtoEnteteConsultationSoldeElt.getSoldeClientHorsGroupePourIntermediaire(), beanReplicator));
        enteteConsultationSolde.setSoldeClientTotalPourIntermediaire(buildCompteClientApporteur(
                        dtoEnteteConsultationSoldeElt.getSoldeClientTotalPourIntermediaire(), beanReplicator));
        enteteConsultationSolde.setSoldeClientViePourintermediaire(buildCompteClientApporteur(
                        dtoEnteteConsultationSoldeElt.getSoldeClientViePourintermediaire(), beanReplicator));
        enteteConsultationSolde.setSoldeContratHorsGroupePourIntermediaire(buildCompteClientContrat(
                        dtoEnteteConsultationSoldeElt.getSoldeContratHorsGroupePourIntermediaire(), beanReplicator));
        enteteConsultationSolde.setSoldeContratTotalPourIntermediaire(buildCompteClientContrat(
                        dtoEnteteConsultationSoldeElt.getSoldeContratTotalPourIntermediaire(), beanReplicator));
        enteteConsultationSolde.setSoldeContratViePourintermediaire(buildCompteClientContrat(
                        dtoEnteteConsultationSoldeElt.getSoldeContratViePourintermediaire(), beanReplicator));
        enteteConsultationSolde.setSuiviClient(buildSuiviEtatClient(dtoEnteteConsultationSoldeElt.getSuiviClient(),
                        beanReplicator));

        return enteteConsultationSolde;
    }

    /**
     * @param dtoSoldeCompteClientChezApporteur solde client compte apporteur
     * @param beanReplicator bean replicator
     * @return ISoldeCompteClientChezApporteur
     */
    private ISoldeCompteClientChezApporteur buildCompteClientApporteur(
                    DtoSoldeCompteClientChezApporteur dtoSoldeCompteClientChezApporteur, BeanReplicator beanReplicator) {

        ISoldeCompteClientChezApporteur soldeCompteClientChezApporteur = null;

        if (dtoSoldeCompteClientChezApporteur != null) {

            soldeCompteClientChezApporteur =
                            beanReplicator.replicateBean(dtoSoldeCompteClientChezApporteur,
                                            DTOSoldeCompteClientChezApporteur.class);

            IQuantity soldeConfie = buildQuantity(dtoSoldeCompteClientChezApporteur.getSoldeConfie(), beanReplicator);
            IQuantity soldeNonPreleve =
                            buildQuantity(dtoSoldeCompteClientChezApporteur.getSoldeNonPreleve(), beanReplicator);
            IQuantity soldePreleve = buildQuantity(dtoSoldeCompteClientChezApporteur.getSoldePreleve(), beanReplicator);
            IQuantity soldeTotal = buildQuantity(dtoSoldeCompteClientChezApporteur.getSoldeTotal(), beanReplicator);

            soldeCompteClientChezApporteur.setSoldeConfie(soldeConfie);
            soldeCompteClientChezApporteur.setSoldeNonPreleve(soldeNonPreleve);
            soldeCompteClientChezApporteur.setSoldePreleve(soldePreleve);
            soldeCompteClientChezApporteur.setSoldeTotal(soldeTotal);

        }

        return soldeCompteClientChezApporteur;
    }

    /**
     * @param dtoSoldeCompteClientContrat solde compte client contrat
     * @param beanReplicator bean replicator
     * @return ISoldeCompteClientContrat
     */
    private ISoldeCompteClientContrat buildCompteClientContrat(DtoSoldeCompteClientContrat dtoSoldeCompteClientContrat,
                    BeanReplicator beanReplicator) {

        ISoldeCompteClientContrat soldeCompteClientContrat = null;

        if (dtoSoldeCompteClientContrat != null) {

            soldeCompteClientContrat =
                            beanReplicator.replicateBean(dtoSoldeCompteClientContrat, DTOSoldeCompteClientContrat.class);

            IQuantity soldeNonPreleve = buildQuantity(dtoSoldeCompteClientContrat.getSoldeNonPreleve(), beanReplicator);
            IQuantity soldePreleve = buildQuantity(dtoSoldeCompteClientContrat.getSoldePreleve(), beanReplicator);
            IQuantity soldeTotal = buildQuantity(dtoSoldeCompteClientContrat.getSoldeTotal(), beanReplicator);

            soldeCompteClientContrat.setSoldeNonPreleve(soldeNonPreleve);
            soldeCompteClientContrat.setSoldePreleve(soldePreleve);
            soldeCompteClientContrat.setSoldeTotal(soldeTotal);

        }

        return soldeCompteClientContrat;
    }

    /**
     * @param dtoSuiviEtatClient suivi etat client
     * @param beanReplicator bean replicator
     * @return ISuiviEtatClient
     */
    private ISuiviEtatClient buildSuiviEtatClient(DtoSuiviEtatClient dtoSuiviEtatClient, BeanReplicator beanReplicator) {

        ISuiviEtatClient suiviEtatClient =
                        dtoSuiviEtatClient == null ? null : beanReplicator.replicateBean(dtoSuiviEtatClient,
                                        DTOSuiviEtatClient.class);

        return suiviEtatClient;
    }

    /**
     * @param dtoTechnique technique
     * @param beanReplicator bean replicator
     * @return ITechnique
     */
    private ITechnique buildTechnique(DtoTechnique dtoTechnique, BeanReplicator beanReplicator) {

        ITechnique technique =
                        dtoTechnique == null ? null : beanReplicator.replicateBean(dtoTechnique, DTOTechnique.class);

        return technique;
    }

    /**
     * @param monetaryQuantity monetary quantity
     * @param beanReplicator bean replicator
     * @return IQuantity
     */
    private IQuantity buildQuantity(MonetaryQuantity monetaryQuantity, BeanReplicator beanReplicator) {

        IQuantity quantity =
                        monetaryQuantity == null ? null : beanReplicator.replicateBean(monetaryQuantity,
                                        DTOQuantity.class);

        return quantity;
    }
}
